﻿// Copyright (c) 2010-2012, MatthiWare
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software. 
// You shall include 'MatthiWare' in the credits/about section of the program
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.

namespace OpenGameEngine
{
    using System;
    using System.Text;
    using System.Runtime.Serialization;
    using System.Security.Permissions;

    [Serializable]
    public class CoreException
        : Exception
    {
        public String Module { get; private set; }

        public CoreException()
            : base()
        {
            Module = "Unknown";
        }

        public CoreException(String msg, Exception inner)
            : base(msg, inner)
        {
            Module = "Unknown";
        }

        protected CoreException(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
            Module = "Unknown";
        }

        public CoreException(String msg, Exception inner, String mod)
            : base(msg, inner)
        {
            Module = "Unknown";
            if (mod.Length > 0)
                Module = mod;
        }

        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendLine("HRESULT: " + this.HResult.ToString());
            sb.AppendLine("Module: " + this.Module);
            sb.AppendLine("Message: " + this.Message);
            sb.AppendLine("Stacktrace: " + this.StackTrace);
            return sb.ToString();
        }

        [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
        public override void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            base.GetObjectData(info, context);
        }
    }
}
